package estructuras;


import estructuras.Node;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Clase para listas circulares 
 * Basado parcialmente en la estructura definida por Duane Bailey en el libro Java Structures.
 * @author asus
 */
public class CircularList<E> {
    
    /**
     * Referencia a la cola de la lista
     */
    protected Node<E> tail;
    
    /**
     * Número de elementos en la lista
     */
    protected int count;
    
    /**
     * Constructor de la clase.
     * Post: Se crea una nueva lista circular vacía.
     */
    public CircularList() {
        tail = null;
        count = 0;
    }
    
    /**
     * Agrega el parámetro al principio de la lista.
     * @param value Valor a agregar
     * Post: El parámetro fue ingresado al principio de la lista.
     */
    public void addFirst(E value) {
        Node<E> temp = new Node<E>(value);
        if (tail == null) { 
            tail = temp;
            tail.setNextElement(tail);
        } else { 
            temp.setNextElement(tail.nextElement());
            tail.setNextElement(temp);
        }
        count++;
    }
    
    /**
     * Agrega el parámetro al final de la lista.
     * @param value Valor a agregar
     * Post: El parámetro fue ingresado al final de la lista.
     */
    public void addLast(E value) {
        addFirst(value);
        tail = tail.nextElement();
        count++;
    }
    
    /**
     * Elimina el último valor de la .
     * @return Valor eliminado.
     */
    public E removeLast() {
        Node<E> finger = tail;
        while (finger.nextElement() != tail) {
            finger = finger.nextElement();
        }
        Node<E> temp = tail;
        if (finger == tail) {
            tail = null;
        } else {
            finger.setNextElement(tail.nextElement());
            tail = finger;
        }
        count--;
        return temp.value();
   }
    
    /**
     * Indica si la lista está vacía.
     * @return true si la lista está vacía, false en el caso contrario.
     */
   public boolean isEmpty() {
       return tail == null;
   } 
    
}
